package com.tdam2011.grupo04.SMSWeb;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import com.tdam2011.grupo04.Agenda;
import com.tdam2011.grupo04.MasterListActivity;
import com.tdam2011.grupo04.R;
import com.tdam2011.grupo04.Sql;
import com.tdam2011.grupo04.entidades.Contacto;
import com.tdam2011.grupo04.entidades.ListaContactos;
import com.tdam2011.grupo04.entidades.Mensaje;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewSwitcher;
import android.widget.AdapterView.OnItemClickListener;

public class HistorialMensajesWeb extends MasterListActivity implements OnClickListener, OnItemClickListener, OnItemLongClickListener{	
	
	private int isUsuarioRegistrado;
	
	/********** ATRIBUTOS LOGIN ***************************/
	private ViewSwitcher viewSwitcher;
	private Button btn_registrarse;
	private Button btn_login;
	
	private TextView txt_nombreUsuario;
	private TextView txt_contraseniaUsuario;
	private TextView txt_repContraseniaUsuario;
	
	private boolean pantallaRegVisible= false;
	
	private final int DIALOG_ERROR_CONTRASENIA= 0;
	private final int DIALOG_ERROR_SIN_CONEXION= 1;
	private final int DIALOG_INICIAR_SESION= 2;
	
	/************* ATRIBUTOS HISTORIAL *********************/
	private final int DIALOG_PULSACION_LARGA= 3;
	
	private final int OP_AGREGAR_CONTACTO= 0;
	private final int OP_ELIMINAR_CONVERSACION= 1;

	private ImageButton img_nuevo_smsWeb;
	private TextView txt_nuevo_smsWeb;
	
	private MensajeWebAdapter adapter;
	
	private com.tdam2011.grupo04.entidades.Mensaje conversacionSeleccionada;
	
	private LinearLayout l_login;
	
	static final int RC_AGREGAR_CONTACTO= 1;
	static final int RC_ENVIAR_MENSAJE= 2;
		
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.historiales);
				
		SharedPreferences app_preferences = getSharedPreferences("usuarioRegistrado", MODE_PRIVATE); 
        isUsuarioRegistrado= app_preferences.getInt("usuarioRegistrado", 0);
        
        l_login= (LinearLayout) findViewById(R.id.lout_log);
        if(isUsuarioRegistrado != 0)
        	l_login.setVisibility(LinearLayout.GONE);
		
    	iniciarHistorial();
    	iniciarLogin();
	}
	
	private void iniciarHistorial(){
		img_nuevo_smsWeb= (ImageButton)findViewById(R.id.img_nuevo_mensaje);
        txt_nuevo_smsWeb= (TextView)findViewById(R.id.txt_nuevo_mensaje);
	    
	    img_nuevo_smsWeb.setBackgroundResource(R.drawable.nuevo_mensajeweb);
	    txt_nuevo_smsWeb.setText("Nuevo Mensaje Web");
        
        adapter= new MensajeWebAdapter();
        setListAdapter(adapter);
        
        this.getListView().setOnItemClickListener(this);
        this.getListView().setOnItemLongClickListener(this);
        this.getListView().setTextFilterEnabled(true);
	}
	
	private void iniciarLogin(){
		viewSwitcher= (ViewSwitcher)findViewById(R.id.viewSwitcher);
        
        btn_registrarse= (Button)findViewById(R.id.btn_registrarse);
        btn_registrarse.setOnClickListener(this);
        
        btn_login= (Button)findViewById(R.id.btn_login);
        btn_login.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				showDialog(DIALOG_INICIAR_SESION);
			}
		});
	}
	
	@Override
	protected void onResume(){
		super.onResume();
		if(isUsuarioRegistrado != 0)
			cargarMensajesWeb();
	}
	
	@Override 
	public void onActivityResult(int requestCode, int resultCode, Intent data) {     
		super.onActivityResult(requestCode, resultCode, data); 
		switch(requestCode) { 
			case RC_AGREGAR_CONTACTO:
				if(resultCode == Agenda.RESULT_OK){
					String idContacto= data.getStringExtra("idContacto");
					String nombreContacto= data.getStringExtra("nombreContacto");
					conversacionSeleccionada.setIdContacto(Long.parseLong(idContacto));
					conversacionSeleccionada.setLabelContacto(nombreContacto);
					
					SharedPreferences app_preferences = getSharedPreferences("usuarioRegistrado", MODE_PRIVATE); 
			        String duenio= app_preferences.getString("usuario", null);
					Sql sql= new Sql(this);
					sql.updateMensajeWeb(duenio, conversacionSeleccionada.getNombreContacto(), idContacto);
				}
				break; 
			case RC_ENVIAR_MENSAJE:
				if(resultCode == MensajeWeb.RESULT_OK)
					Toast.makeText(HistorialMensajesWeb.this, "Mensaje enviado correctamente", Toast.LENGTH_SHORT).show();
				break;
		} 
	}

	public void nuevoMensaje(View v){
		Intent intent= new Intent(HistorialMensajesWeb.this, MensajeWeb.class);
		startActivityForResult(intent, RC_ENVIAR_MENSAJE);
	}
	
	@Override
	protected void publishFilterApplied() {
		super.publishFilterApplied();
		this.cargarMensajesWeb();
	}
	
	private void cargarMensajesWeb(){
		SharedPreferences app_preferences = getSharedPreferences("usuarioRegistrado", MODE_PRIVATE);
		String user= app_preferences.getString("usuario", null);
		Sql sql = new Sql(this);		
		String columns= "max(mensajeWebID) as id, usuarioDestino, mensaje, fecha, contactoID";
		String condicion= "usuario='" + user +"' group by usuarioDestino order by fecha desc";
		Cursor cur = sql.getAllMensajesWeb(columns, condicion);
		
		adapter.clearList();
		
		if (cur.getCount() > 0) {
			while (cur.moveToNext()){
				int idMensaje= cur.getInt(cur.getColumnIndex("id"));
				String usuario = cur.getString(cur.getColumnIndex("usuarioDestino"));
				String cuerpoMensaje = cur.getString(cur.getColumnIndex("mensaje"));
				long fecha= cur.getLong(cur.getColumnIndex("fecha"));
				long idContacto= cur.getLong(cur.getColumnIndex("contactoID"));
				
				String labelContacto= usuario;
				if((usuario != null) && (!contactFilterApplied || usuario.toLowerCase().startsWith(contactFilter))) {					
					if(idContacto > 0){
						List<Contacto> contactos= new ListaContactos().getContactos("DISPLAY_NAME ASC", this);
						for(Contacto contacto : contactos)
							if(contacto.getId().equals(String.valueOf(idContacto))){
								labelContacto= contacto.getNombre();
								break;
							}
					}
						
					com.tdam2011.grupo04.entidades.Mensaje mensajeWeb = new com.tdam2011.grupo04.entidades.Mensaje();
					mensajeWeb.setId(idMensaje);
					mensajeWeb.setNombreContacto(usuario);
					mensajeWeb.setLabelContacto(labelContacto);
					mensajeWeb.setCuerpoMensaje(cuerpoMensaje);
					mensajeWeb.setFechaEnvio(fecha);
					mensajeWeb.setIdContacto(idContacto);
						
					if(adapter.agregarALista(mensajeWeb)) adapter.addMensaje(mensajeWeb);
				}
			}			
		}
		cur.close();
		sql.close();
		adapter.notifyDataSetChanged();
	}
	
	@Override
    public boolean onCreateOptionsMenu(Menu menu){
		MenuInflater inflater = getMenuInflater();
	    inflater.inflate(R.menu.histmensajesweb_menu, menu);
	    return true;
    }
	
	public boolean onOptionsItemSelected(MenuItem item){
		if(item.getTitle().equals("Ver Contactos")){
			Intent listContactIntent= new Intent(HistorialMensajesWeb.this, ListaContactosWeb.class);
			startActivity(listContactIntent);
		}else if(item.getTitle().equals("Cerrar Sesion")){
			SharedPreferences app_preferences = getSharedPreferences("usuarioRegistrado", MODE_PRIVATE);
			SharedPreferences.Editor editor = app_preferences.edit();
			editor.remove("usuario");
			editor.remove("contrasenia");
			editor.putInt("usuarioRegistrado", 0);
			editor.commit();
			
			Intent servicio= new Intent(HistorialMensajesWeb.this, ConsultaMensajeService.class);
			stopService(servicio);
			
			isUsuarioRegistrado = 0;
			l_login.setVisibility(LinearLayout.VISIBLE);
			adapter.clearList();
		}
    	super.onOptionsItemSelected(item);
    	return false;
    }
	
	class MensajeWebAdapter extends BaseAdapter implements Filterable{
		private ArrayList<Mensaje> mensajes;
		private LayoutInflater inflater;
		private ContactFilter filter;

		public MensajeWebAdapter() {
			mensajes = new ArrayList<Mensaje>();
			inflater = LayoutInflater.from(HistorialMensajesWeb.this);
		}

		public void addMensaje(com.tdam2011.grupo04.entidades.Mensaje mensaje) {
			if (mensaje != null) 
				this.mensajes.add(mensaje);
		}
		
		public boolean agregarALista(Mensaje mensajeWeb){	
			if(!mensajes.isEmpty())
				for(Mensaje msj : mensajes)
					if(msj.getNombreContacto().equals(mensajeWeb.getNombreContacto()))
						return false;
			
			return true;
		}
		
		public int getCount() {
			return mensajes.size();
		}
		
		public Object getItem(int position) {
			return mensajes.get(position);
		}

		public long getItemId(int position) {
			return position;
		}
		
		public void clearList(){
			mensajes.clear();
		}
		
		public void deleteItems(String usuario){
			for(com.tdam2011.grupo04.entidades.Mensaje mensaje : mensajes)
				if(mensaje.getNombreContacto().equals(usuario)){
					mensajes.remove(mensaje);
					break;
				}
		}

		class Holder {
			private ImageView img_contacto;
			private TextView txt_nombreContacto;
			private TextView txt_fechaEnvio;
			private TextView txt_cuerpoMensaje;
		}

		public View getView(final int position, View convertView, ViewGroup arg2){
			Holder holder;
			if (convertView == null) {
				convertView = inflater.inflate(R.layout.historiales_fila , null);
				holder = new Holder();
				holder.txt_nombreContacto = (TextView) convertView
						.findViewById(R.id.txt_nombreContacto);
				holder.txt_fechaEnvio = (TextView) convertView
						.findViewById(R.id.txt_fechaMensaje);
				holder.img_contacto = (ImageView) convertView
						.findViewById(R.id.img_contacto);
				holder.txt_cuerpoMensaje = (TextView) convertView
						.findViewById(R.id.txt_cuerpoMensaje);
				convertView.setTag(holder);
			} else {
				holder = (Holder) convertView.getTag();
			}
			
			com.tdam2011.grupo04.entidades.Mensaje mensaje = (com.tdam2011.grupo04.entidades.Mensaje) getItem(position);
			
			String fecha = millisToDate(mensaje.getFechaEnvio());
			
			holder.img_contacto.setVisibility(ImageView.GONE);
			
			holder.txt_nombreContacto.setText(mensaje.getLabelContacto());
			holder.txt_cuerpoMensaje.setText(mensaje.getCuerpoMensaje());
			holder.txt_fechaEnvio.setText(fecha);

			return convertView;
		}
		
		@Override
		public Filter getFilter() {
			if (filter == null) {
				filter = new ContactFilter();
			}
			return filter;
		}
	}
	
	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
		com.tdam2011.grupo04.entidades.Mensaje mensaje= (com.tdam2011.grupo04.entidades.Mensaje)adapter.getItem(position);
		Intent intent= new Intent(HistorialMensajesWeb.this, MensajeWeb.class);
		intent.putExtra("labelUsuario", mensaje.getLabelContacto());
		intent.putExtra("usuario", mensaje.getNombreContacto());
		intent.putExtra("cuerpoMensaje", mensaje.getCuerpoMensaje());
		intent.putExtra("idcontacto", String.valueOf(mensaje.getIdContacto()));
		startActivityForResult(intent, RC_ENVIAR_MENSAJE);
	}
	
	@Override
	public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
		conversacionSeleccionada= (com.tdam2011.grupo04.entidades.Mensaje)adapter.getItem(position);
		showDialog(DIALOG_PULSACION_LARGA);
		
		return false;
	}
	
	@Override
	protected Dialog onCreateDialog(int id) {
		if(id == DIALOG_PULSACION_LARGA)
			return historialDialog(id);
		else
			return loginDialog(id);
	}
	
	private Dialog historialDialog(int id){
		final CharSequence[] op = {"Agregar Contacto", "Eliminar Conversación"};
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle(conversacionSeleccionada.getNombreContacto());
		builder.setItems(op, new DialogInterface.OnClickListener() {
		    public void onClick(DialogInterface dialog, int item) {
		    	switch(item){
			    	case OP_AGREGAR_CONTACTO:
			    		Intent contactIntent= new Intent(HistorialMensajesWeb.this, Agenda.class);
			    		contactIntent.putExtra("nombreUsuario", conversacionSeleccionada.getNombreContacto());
			    		startActivityForResult(contactIntent, RC_AGREGAR_CONTACTO);
			    		break;
			    	case OP_ELIMINAR_CONVERSACION: 
			    		SharedPreferences app_preferences = getSharedPreferences("usuarioRegistrado", MODE_PRIVATE);
			    		String user= app_preferences.getString("usuario", null);
			    		eliminarConversacion(user, conversacionSeleccionada);
			    		break;
		    	}
		    }
		});
		AlertDialog alert = builder.create();
			
		return alert;
	}
	
	private void eliminarConversacion(String user, com.tdam2011.grupo04.entidades.Mensaje mensaje){
		Sql sql = new Sql(this);
		sql.eliminarConversacionWeb(user, mensaje.getNombreContacto());
		sql.close();
		
		adapter.deleteItems(mensaje.getNombreContacto());
		adapter.notifyDataSetChanged();
	}
	
	public static String millisToDate(long currentTime) {
	    String finalDate;
	    Calendar calendar = Calendar.getInstance();
	    calendar.setTimeInMillis(currentTime);
	    Date date = calendar.getTime();
	    finalDate = date.toString();
	    return finalDate;
	}
	
	/********************************************* LOGIN ******************************************************/
	@Override
	public void onClick(View v) {
		if(!pantallaRegVisible){
			Animation animation= AnimationUtils.loadAnimation(this, R.anim.btn_style_next);
			btn_registrarse.startAnimation(animation);
			nextView();
			
			pantallaRegVisible= true;
			btn_registrarse.setText("Registrar");
			btn_login.setVisibility(Button.GONE);
		}else
			registrar();
		
	}
	
	private void nextView(){
		viewSwitcher.setInAnimation(this, R.anim.in_animation);
		viewSwitcher.setOutAnimation(this, R.anim.out_animation);
		viewSwitcher.showNext();
	}
	
	private void registrar(){
		if(!ComunicacionServer.isOnline){
			showDialog(DIALOG_ERROR_SIN_CONEXION);
			return;
		}
		
		txt_nombreUsuario= (TextView)findViewById(R.id.txt_nombreUsuario);
		txt_contraseniaUsuario= (TextView)findViewById(R.id.txt_contraseniaUsuario);
		txt_repContraseniaUsuario= (TextView)findViewById(R.id.txt_repContraseniaUsuario);
		
		String usuario= txt_nombreUsuario.getText().toString();
		String contrasenia= txt_contraseniaUsuario.getText().toString();
		String repContrasenia= txt_repContraseniaUsuario.getText().toString();
		
		if(!contrasenia.equals(repContrasenia)){
			showDialog(DIALOG_ERROR_CONTRASENIA);
			return;
		}
		
		ComunicacionServer cs= new ComunicacionServer(usuario, contrasenia);
		
		try{
			String xml= cs.getXML(ComunicacionServer.COM_LOGIN, null, null, null);
			if(cs.parsear(xml, ComunicacionServer.COM_LOGIN)){
				// Guardo el usuario junto con la fecha de alta	
				SharedPreferences app_preferences = getSharedPreferences("usuarioRegistrado", MODE_PRIVATE); 
		        SharedPreferences.Editor editor = app_preferences.edit();
		        editor.putInt("usuarioRegistrado", 1);
		        editor.putString("usuario", txt_nombreUsuario.getText().toString());
		        editor.putString("contrasenia", txt_contraseniaUsuario.getText().toString());
		        
		        Date fecha= new Date();
		        SimpleDateFormat formatoFecha= new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		        editor.putString("fecha", formatoFecha.format(fecha));
		        editor.commit();
		        
		        Toast.makeText(HistorialMensajesWeb.this, "Registración Exitosa", Toast.LENGTH_SHORT).show();
				setResult(RESULT_OK);
				
				isUsuarioRegistrado= 1;
				l_login.setVisibility(LinearLayout.GONE);
				cargarMensajesWeb();
			}else{
				Toast.makeText(HistorialMensajesWeb.this, "Error en el usuario!", Toast.LENGTH_SHORT).show();
			}
		}catch(Exception e){ e.printStackTrace(); }
	}
	
	private Dialog loginDialog(int id){
		if(id == DIALOG_INICIAR_SESION) return loginDialog();
		
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		switch (id){
			case DIALOG_ERROR_CONTRASENIA:
				builder.setTitle("Error en contraseña");
				builder.setMessage("Las contraseñas ingresadas no coinciden. Por favor, ingrese de nuevo los campos.");
				break;
				
			case DIALOG_ERROR_SIN_CONEXION:
				builder.setTitle("Sin Conexión");
				builder.setMessage("Para realizar esta acción es necesario disponer de una conexión de datos activa");
				break;
		}
			
		builder.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {		
			@Override
			public void onClick(DialogInterface dialog, int which) {
		        dialog.cancel();
			}
		});
		
		AlertDialog alert = builder.create();
		return alert;
	}
	
	private Dialog loginDialog(){
		Dialog dialog = new Dialog(this);
		dialog.setTitle("Iniciar Sesion");
		dialog.setContentView(R.layout.iniciar_sesion);
		
		final TextView txt_usuario= (TextView) dialog.findViewById(R.id.txt_is_usuario);
		final TextView txt_pass= (TextView) dialog.findViewById(R.id.txt_is_pass);
		Button btn_aceptar= (Button) dialog.findViewById(R.id.btn_login_aceptar);
		Button btn_cancelar= (Button) dialog.findViewById(R.id.btn_login_cancelar);
		
		btn_aceptar.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				String usuario= txt_usuario.getText().toString();
				String contrasenia= txt_pass.getText().toString();
				
				if(usuario.isEmpty() || contrasenia.isEmpty()){
					Toast.makeText(HistorialMensajesWeb.this, "Es necesario que ingrese el usuario y la contraseña", Toast.LENGTH_SHORT).show();
					return;
				}
				
				if(!ComunicacionServer.isOnline){
					dismissDialog(DIALOG_INICIAR_SESION);
					showDialog(DIALOG_ERROR_SIN_CONEXION);
				}else{
					ComunicacionServer cs= new ComunicacionServer(usuario, contrasenia);
					
					Date fecha= new Date();	
			        SimpleDateFormat formatoFecha= new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
					String xml= cs.getXML(ComunicacionServer.COM_CONSULTAR, null, null, formatoFecha.format(fecha));
					try {
						if(cs.parsear(xml, ComunicacionServer.COM_CONSULTAR)){
							Handler handler= cs.getHandler();
							if(handler != null && handler.getIsOK()){
								SharedPreferences app_preferences = getSharedPreferences("usuarioRegistrado", MODE_PRIVATE); 
						        SharedPreferences.Editor editor = app_preferences.edit();
						        editor.putInt("usuarioRegistrado", 1);
						        editor.putString("usuario", usuario);
						        editor.putString("contrasenia", contrasenia);
						        editor.commit();
						        
						        Toast.makeText(HistorialMensajesWeb.this, "Ha iniciado Sesión", Toast.LENGTH_SHORT).show();
						        
						        Intent servicio= new Intent(HistorialMensajesWeb.this, ConsultaMensajeService.class);
						    	startService(servicio);
						    	
						    	dismissDialog(DIALOG_INICIAR_SESION);

						    	isUsuarioRegistrado= 1;
								l_login.setVisibility(LinearLayout.GONE);
								cargarMensajesWeb();
							}
						}else
							Toast.makeText(HistorialMensajesWeb.this, "Usuario o contraseña incorrectos", Toast.LENGTH_LONG).show();
					} catch (Exception e){ e.printStackTrace(); }
				}
			}
		});
		
		btn_cancelar.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				dismissDialog(DIALOG_INICIAR_SESION);
			}
		});
		
		return dialog;
	}
}
